#!/bin/bash

# ================================
# 可配置的警告阈值
# ================================

# CPU使用率警告阈值 (%)
CPU_WARNING=80

# 内存使用率警告阈值 (%)
MEM_WARNING=85

# 磁盘使用率警告阈值 (%)
DISK_WARNING=90

# 系统负载警告阈值 (相对于CPU核心数)
LOAD_WARNING_MULTIPLIER=1.5

# 进程数量警告阈值
PROCESS_WARNING=500

# 邮件配置
ALERT_EMAIL="ht_qaq@163.com"

# 日志配置
LOG_FILE="/var/log/system_monitor.log"
LOG_MAX_SIZE=10485760  # 10MB in bytes

# ================================
# 日志管理函数
# ================================

# 带时间戳的日志函数
log_message() {
    local message=$1
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] $message" | tee -a "$LOG_FILE"
}

# 检查并管理日志文件大小
manage_log_file() {
    # 如果日志文件不存在，创建它
    if [ ! -f "$LOG_FILE" ]; then
        touch "$LOG_FILE"
        chmod 644 "$LOG_FILE"
        log_message "创建新的监控日志文件"
        return
    fi
    
    # 检查日志文件大小
    local log_size=$(stat -c%s "$LOG_FILE" 2>/dev/null || stat -f%z "$LOG_FILE" 2>/dev/null)
    
    if [ "$log_size" -gt "$LOG_MAX_SIZE" ]; then
        # 备份旧日志文件
        local backup_file="${LOG_FILE}.$(date +%Y%m%d_%H%M%S)"
        mv "$LOG_FILE" "$backup_file"
        touch "$LOG_FILE"
        chmod 644 "$LOG_FILE"
        log_message "日志文件超过10M，已备份为: $backup_file"
        echo "日志文件已备份: $backup_file"
    fi
}

# ================================
# 主监控脚本
# ================================

# 管理日志文件
manage_log_file

# 记录监控开始
log_message "开始系统资源监控"

# 初始化告警信息
ALERT_MESSAGE=""

# 记录监控头部信息
log_message "================================================"
log_message "Linux 系统资源监控报告"
log_message "主机名: $(hostname)"
log_message "警告阈值 - CPU:${CPU_WARNING}% 内存:${MEM_WARNING}% 磁盘:${DISK_WARNING}%"
log_message "================================================"

# 1. CPU 使用率监控
log_message "1. CPU 使用情况:"
log_message "----------------"
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | awk -F'%' '{print $1}')
log_message "当前CPU使用率: ${cpu_usage}%"

# CPU使用率告警检查
if (( $(echo "$cpu_usage > $CPU_WARNING" | bc -l) )); then
    ALERT_MESSAGE+="CPU使用率过高: ${cpu_usage}% (阈值: ${CPU_WARNING}%)\n"
    log_message "CPU使用率过高: ${cpu_usage}% (超过阈值: ${CPU_WARNING}%)"
fi

# 查看负载平均值
load_avg=$(uptime | awk -F'load average:' '{print $2}')
log_message "系统负载平均值: ${load_avg}"

# 负载告警检查
cpu_cores=$(nproc)
load_current=$(echo $load_avg | awk -F',' '{print $1}' | sed 's/ //g')
load_threshold=$(echo "$cpu_cores * $LOAD_WARNING_MULTIPLIER" | bc)
if (( $(echo "$load_current > $load_threshold" | bc -l) )); then
    ALERT_MESSAGE+="系统负载过高: ${load_avg} (阈值: ${load_threshold})\n"
    log_message "系统负载过高: ${load_avg} (超过阈值: ${load_threshold})"
fi

# 按进程查看CPU使用情况
log_message ""
log_message "CPU使用率最高的5个进程:"
ps aux --sort=-%cpu | head -6 | awk '{print $11, $3"%"}' | while read line; do
    log_message "$line"
done
log_message ""

# 2. 内存使用情况监控
log_message "2. 内存使用情况:"
log_message "----------------"
memory_info=$(free -h)
echo "$memory_info" | awk '
NR==1{print "类型      总量    已用    空闲    共享   缓冲/缓存  可用"}
NR==2{print "物理内存: "$2"  "$3"  "$4"  "$5"  "$6"  "$7}
NR==3{print "交换空间: "$2"  "$3"  "$4}' | while read line; do
    log_message "$line"
done

# 内存使用率告警检查
mem_usage_percent=$(free | awk 'NR==2{printf "%.0f", $3/$2*100}')
if (( $mem_usage_percent > $MEM_WARNING )); then
    ALERT_MESSAGE+="内存使用率过高: ${mem_usage_percent}% (阈值: ${MEM_WARNING}%)\n"
    log_message "内存使用率过高: ${mem_usage_percent}% (超过阈值: ${MEM_WARNING}%)"
fi
log_message ""

# 3. 磁盘使用情况监控
log_message "3. 磁盘使用情况:"
log_message "----------------"
log_message "磁盘空间使用:"
df -h | grep -v tmpfs | awk '{if(NR>1) print $1"  "$3"已使用/总共"$2"  ("$5"使用率)"}' | while read line; do
    log_message "$line"
done

# 磁盘使用率告警检查
df -h | grep -v tmpfs | awk -v threshold="$DISK_WARNING" 'NR>1 && $5+0 > threshold {print "磁盘" $1 "使用率过高: " $5 " (阈值: " threshold "%)"}' | while read alert; do
    ALERT_MESSAGE+="${alert}\n"
    log_message "⚠️ $alert"
done
log_message ""

# 磁盘I/O监控（需要sysstat包）
if command -v iostat &> /dev/null; then
    log_message "磁盘I/O统计:"
    iostat -d 1 1 | awk '
    NR==3{print "设备     传输速度   读取速度   写入速度   队列长度"}
    NR>3 && NF>=6{print $1"     "$2"       "$3"       "$4"       "$6}' | while read line; do
        log_message "$line"
    done
else
    log_message "提示: 安装sysstat包可获得更详细磁盘I/O信息 (sudo apt install sysstat)"
fi
log_message ""

# 4. 进程数量监控
log_message "4. 系统进程统计:"
log_message "----------------"
total_processes=$(ps -e | wc -l)
log_message "总进程数: $total_processes"

# 进程数告警检查
if (( $total_processes > $PROCESS_WARNING )); then
    ALERT_MESSAGE+="进程数过多: ${total_processes} (阈值: ${PROCESS_WARNING})\n"
    log_message "进程数过多: ${total_processes} (超过阈值: ${PROCESS_WARNING})"
fi

log_message "按用户分布的进程数:"
ps -eo user --no-headers | sort | uniq -c | sort -nr | head -5 | while read line; do
    log_message "$line"
done
log_message ""

log_message "================================================"
log_message "监控完成于: $(date)"

# 发送告警邮件（如果有告警信息）
if [ -n "$ALERT_MESSAGE" ]; then
    ALERT_SUBJECT="【系统告警】$(hostname) 资源异常 - $(date '+%Y-%m-%d %H:%M')"
    
    # 构建完整的邮件内容
    FULL_MESSAGE="主机名: $(hostname)
监控时间: $(date)
当前阈值设置:
- CPU警告阈值: ${CPU_WARNING}%
- 内存警告阈值: ${MEM_WARNING}%
- 磁盘警告阈值: ${DISK_WARNING}%
- 进程数警告阈值: ${PROCESS_WARNING}
----------------------------------------
告警详情:
${ALERT_MESSAGE}
----------------------------------------
当前资源状态:
CPU使用率: ${cpu_usage}%
内存使用率: ${mem_usage_percent}%
系统负载: ${load_avg}
总进程数: ${total_processes}
----------------------------------------
详细日志请查看: ${LOG_FILE}"

    # 发送邮件
    echo -e "$FULL_MESSAGE" | mail -s "$ALERT_SUBJECT" "$ALERT_EMAIL"
    log_message "告警邮件已发送至: $ALERT_EMAIL"
    echo "告警邮件已发送至: $ALERT_EMAIL"
else
    log_message "监控完成，所有资源指标正常"
    echo "所有资源指标正常"
fi

log_message "系统资源监控完成"
log_message "系统资源监控完成"
log_message "系统资源监控完成"
log_message "系统资源监控完成"
log_message "系统资源监控完成"

